home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / nethack.lha / nethack-3.1 / src / pline.c < prev    next >
C/C++ Source or Header  |  1993-01-09  |  5KB  |  260 lines

  1. /*    SCCS Id: @(#)pline.c    3.1    92/11/20    */
  2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  3. /* NetHack may be freely redistributed.  See license for details. */
  4.  
  5. #define NEED_VARARGS /* Uses ... */    /* comment line for pre-compiled headers */
  6. #include "hack.h"
  7. #include "epri.h"
  8.  
  9. #ifndef OVLB
  10. STATIC_DCL boolean no_repeat;
  11. #else /* OVLB */
  12. STATIC_OVL boolean no_repeat = FALSE;
  13. #endif /* OVLB */
  14.  
  15. #ifdef OVLB
  16. static char *FDECL(You_buf, (int));
  17.  
  18. /*VARARGS1*/
  19. /* Note that these declarations rely on knowledge of the internals
  20.  * of the variable argument handling stuff in "tradstdc.h"
  21.  */
  22.  
  23. #if defined(USE_STDARG) || defined(USE_VARARGS)
  24. static void FDECL(vpline, (const char *, va_list));
  25.  
  26. void
  27. pline VA_DECL(const char *, line)
  28.     VA_START(line);
  29.     VA_INIT(line, char *);
  30.     vpline(line, VA_ARGS);
  31.     VA_END();
  32. }
  33.  
  34. # ifdef USE_STDARG
  35. static void
  36. vpline(const char *line, va_list the_args) {
  37. # else
  38. static void
  39. vpline(line, the_args) const char *line; va_list the_args; {
  40. # endif
  41.  
  42. #else    /* USE_STDARG | USE_VARARG */
  43.  
  44. #define vpline pline
  45.  
  46. void
  47. pline VA_DECL(const char *, line)
  48. #endif    /* USE_STDARG | USE_VARARG */
  49.  
  50.     char pbuf[BUFSZ];
  51. /* Do NOT use VA_START and VA_END in here... see above */
  52.  
  53.     if(!line || !*line) return;
  54.     if(!index(line, '%'))
  55.         Strcpy(pbuf,line);
  56.     else
  57.         Vsprintf(pbuf,line,VA_ARGS);
  58.     if(!flags.window_inited) {
  59.         raw_print(pbuf);
  60.         return;
  61.     }
  62. #ifndef MAC
  63.     if(no_repeat && !strcmp(pbuf, toplines))
  64.         return;
  65. #endif /* MAC */
  66.     if (vision_full_recalc) vision_recalc(0);
  67.     if (u.ux) flush_screen(1);        /* %% */
  68.     putstr(WIN_MESSAGE, 0, pbuf);
  69. }
  70.  
  71. /*VARARGS1*/
  72. void
  73. Norep VA_DECL(const char *, line)
  74.     VA_START(line);
  75.     VA_INIT(line, const char *);
  76.     no_repeat = TRUE;
  77.     vpline(line, VA_ARGS);
  78.     no_repeat = FALSE;
  79.     VA_END();
  80.     return;
  81. }
  82.  
  83. /* work buffer for You(), Your(), and verbalize() */
  84. static char *you_buf = 0;
  85. static int you_buf_siz = 0;
  86.  
  87. static char *
  88. You_buf(siz) int siz; {
  89.     if (siz > you_buf_siz) {
  90.         if (you_buf_siz > 0) free((genericptr_t) you_buf);
  91.         you_buf_siz = siz + 10;
  92.         you_buf = (char *) alloc((unsigned) you_buf_siz);
  93.     }
  94.     return you_buf;
  95. }
  96.  
  97. /*VARARGS1*/
  98. void
  99. You VA_DECL(const char *, line)
  100.     char *tmp;
  101.     VA_START(line);
  102.     VA_INIT(line, const char *);
  103.     tmp = You_buf((int)strlen(line) + 5);
  104.     Strcpy(tmp, "You ");
  105.     Strcat(tmp, line);
  106.     vpline(tmp, VA_ARGS);
  107.     VA_END();
  108. }
  109.  
  110. /*VARARGS1*/
  111. void
  112. Your VA_DECL(const char *,line)
  113.     char *tmp;
  114.     VA_START(line);
  115.     VA_INIT(line, const char *);
  116.     tmp = You_buf((int)strlen(line) + 6);
  117.     Strcpy(tmp, "Your ");
  118.     Strcat(tmp, line);
  119.     vpline(tmp, VA_ARGS);
  120.     VA_END();
  121. }
  122.  
  123. /*VARARGS1*/
  124. void
  125. verbalize VA_DECL(const char *,line)
  126.     char *tmp;
  127.     if (!flags.soundok) return;
  128.     VA_START(line);
  129.     VA_INIT(line, const char *);
  130.     tmp = You_buf((int)strlen(line) + 3);
  131.     Strcpy(tmp, "\"");
  132.     Strcat(tmp, line);
  133.     Strcat(tmp, "\"");
  134.     vpline(tmp, VA_ARGS);
  135.     VA_END();
  136. }
  137.  
  138. /*VARARGS1*/
  139. /* Note that these declarations rely on knowledge of the internals
  140.  * of the variable argument handling stuff in "tradstdc.h"
  141.  */
  142.  
  143. #if defined(USE_STDARG) || defined(USE_VARARGS)
  144. static void FDECL(vraw_printf,(const char *,va_list));
  145.  
  146. void
  147. raw_printf VA_DECL(const char *, line)
  148.     VA_START(line);
  149.     VA_INIT(line, char *);
  150.     vraw_printf(line, VA_ARGS);
  151.     VA_END();
  152. }
  153.  
  154. # ifdef USE_STDARG
  155. static void
  156. vraw_printf(const char *line, va_list the_args) {
  157. # else
  158. static void
  159. vraw_printf(line, the_args) const char *line; va_list the_args; {
  160. # endif
  161.  
  162. #else  /* USE_STDARG | USE_VARARG */
  163.  
  164. void
  165. raw_printf VA_DECL(const char *, line)
  166. #endif
  167. /* Do NOT use VA_START and VA_END in here... see above */
  168.  
  169.     if(!index(line, '%'))
  170.         raw_print(line);
  171.     else {
  172.         char pbuf[BUFSZ];
  173.         Vsprintf(pbuf,line,VA_ARGS);
  174.         raw_print(pbuf);
  175.     }
  176. }
  177.  
  178.  
  179. /*VARARGS1*/
  180. void
  181. impossible VA_DECL(const char *, s)
  182.     VA_START(s);
  183.     VA_INIT(s, const char *);
  184.     vpline(s,VA_ARGS);
  185.     pline("Program in disorder - perhaps you'd better Quit.");
  186.     VA_END();
  187. }
  188.  
  189. const char *
  190. align_str(alignment)
  191.     aligntyp alignment;
  192. {
  193.     switch ((int)alignment) {
  194.     case A_CHAOTIC: return "chaotic";
  195.     case A_NEUTRAL: return "neutral";
  196.     case A_LAWFUL:    return "lawful";
  197.     case A_NONE:    return "unaligned";
  198.     }
  199.     return "unknown";
  200. }
  201.  
  202. void
  203. mstatusline(mtmp)
  204. register struct monst *mtmp;
  205. {
  206.     aligntyp alignment;
  207.  
  208.     if (mtmp->ispriest || mtmp->data == &mons[PM_ALIGNED_PRIEST]
  209.                 || mtmp->data == &mons[PM_ANGEL])
  210.         alignment = EPRI(mtmp)->shralign;
  211.     else
  212.         alignment = mtmp->data->maligntyp;
  213.  
  214.     alignment = (alignment > 0) ? A_LAWFUL :
  215.         (alignment < 0) ? A_CHAOTIC :
  216.         A_NEUTRAL;
  217.     pline("Status of %s (%s):  Level %d  Gold %lu  HP %d(%d) AC %d%s%s",
  218.         mon_nam(mtmp),
  219.         align_str(alignment),
  220.         mtmp->m_lev,
  221.         mtmp->mgold,
  222.         mtmp->mhp,
  223.         mtmp->mhpmax,
  224.         find_mac(mtmp),
  225.         mtmp->mcan ? ", cancelled" : "" ,
  226.         mtmp->mtame ? ", tame" : "");
  227. }
  228.  
  229. void
  230. ustatusline()
  231. {
  232.     pline("Status of %s (%s%s):  Level %d  Gold %lu  HP %d(%d)  AC %d",
  233.         plname,
  234.             (u.ualign.record >= 20) ? "piously " :
  235.             (u.ualign.record > 13) ? "devoutly " :
  236.             (u.ualign.record > 8) ? "fervently " :
  237.             (u.ualign.record > 3) ? "stridently " :
  238.             (u.ualign.record == 3) ? "" :
  239.             (u.ualign.record >= 1) ? "haltingly " :
  240.             (u.ualign.record == 0) ? "nominally " :
  241.                         "insufficiently ",
  242.         align_str(u.ualign.type),
  243. # ifdef POLYSELF
  244.         u.mtimedone ? mons[u.umonnum].mlevel : u.ulevel,
  245.         u.ugold,
  246.         u.mtimedone ? u.mh : u.uhp,
  247.         u.mtimedone ? u.mhmax : u.uhpmax,
  248. # else
  249.         u.ulevel,
  250.         u.ugold,
  251.         u.uhp,
  252.         u.uhpmax,
  253. # endif
  254.         u.uac);
  255. }
  256.  
  257. #endif /* OVLB */
  258.  
  259. /*pline.c*/
  260.